module dm_4k( 
    input      [11:0]   addr ,// 地址 
    input      [31:0]   din ,// 输入数据
    input               WriteEnble , 
    input      [1:0]    DataType,
    input               DataSign,
    input               clk,
    output reg [31:0]   dout//输出数据
 );
   
    reg     [31:0]  dm[0:2047];
    
    reg [7:0] temp_byte_data;

    parameter   WORD_DATATYPE = 2'b00,HALF_DATATYPE=2'b01,BYTE_DATATYPE=2'b10;
    parameter   SIGN_DATA = 1'b1,UNSIGN_DATA = 1'b0;

    always @(posedge clk) 
    //#1
    begin
        if(WriteEnble)
        begin
            $display(addr,"write:",din);
            if(DataType==WORD_DATATYPE)
                dm[addr[11:2]] = din;
            else if(DataType==HALF_DATATYPE) //如果是半子
            begin
                if(addr[1])
                    dm[addr[11:2]][31:16] = din[15:0];
                else
                    dm[addr[11:2]][15:0]  = din[15:0];
            end
            else if(DataType==BYTE_DATATYPE)
            begin
                if(addr[1:0] == 2'b11)
                    dm[addr[11:2]][31:24] = din[7:0];
                else if(addr[1:0]==2'b10)
                    dm[addr[11:2]][23:16] = din[7:0];
                else if(addr[1:0]==2'b01)
                    dm[addr[11:2]][15:8]  = din[7:0];
                else
                    dm[addr[11:2]][7:0]   = din[7:0];
            end
        end
    end


    always @(negedge clk) begin
            if(DataType==WORD_DATATYPE)
            dout = dm[addr[11:2]];
        else if (DataType==HALF_DATATYPE)
        begin
            if (SIGN_DATA)
            begin
                 if(addr[1])
                    dout = {{16{dm[addr[11:2]][31]}},dm[addr[11:2]][31:16]};
                else
                    dout = {{16{dm[addr[11:2]][15]}},dm[addr[11:2]][15:0]};
            end
            else
            begin
                 if(addr[1])
                    dout = {16'b0000000000000000,dm[addr[11:2]][31:16]};
                else
                    dout = {16'b0000000000000000,dm[addr[11:2]][15:0]};
            end   
        end
        else if (DataType==BYTE_DATATYPE)
        begin
            if(SIGN_DATA)
            begin
                if(addr[1:0]==2'b11)
                    dout = {{24{dm[addr[11:2]][31]}},dm[addr[11:2]][31:24]};
                else if(addr[1:0]==2'b10)
                    dout = {{24{dm[addr[11:2]][23]}},dm[addr[11:2]][23:16]};
                else if(addr[1:0]==2'b01)
                    dout ={{24{dm[addr[11:2]][15]}},dm[addr[11:2]][15:8]};
                else 
                    dout = {{24{dm[addr[11:2]][7]}},dm[addr[11:2]][7:0]};
            end
            else
            begin
                if(addr[1:0]==2'b11)
                    dout = {24'b000000000000000000000000,dm[addr[11:2]][31:24]};
                else if(addr[1:0]==2'b10)
                    dout = {24'b000000000000000000000000,dm[addr[11:2]][23:16]};
                else if(addr[1:0]==2'b01)
                    dout =  {24'b000000000000000000000000,dm[addr[11:2]][15:8]};
                else 
                    dout = {24'b000000000000000000000000,dm[addr[11:2]][7:0]};
            end
        end
    end
endmodule